package com.tqz.rabbitmq;

import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

/**
 * @author <a href="https://github.com/tian-qingzhao">tianqingzhao</a>
 * @since 2024/9/12 8:43
 */
@Component
public class RabbitMQDeadOrderConsumer {

    private static final Logger log = LoggerFactory.getLogger(RabbitMQDeadOrderConsumer.class);

    @RabbitListener(queues = RabbitMQConfig.DEAD_ORDER_QUEUE_NAME, ackMode = "MANUAL")
    public void onOrderMessage(@Payload String body, @Headers Map<String, Object> headers, Channel channel) throws IOException {
        log.info("RabbitMQ消费者收到消息: {}，headers：{}", body, headers);

        /**
         * Delivery Tag 用来标识信道中投递的消息。
         * RabbitMQ 推送消息给 Consumer 时，会附带一个 Delivery Tag，
         * 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。
         * RabbitMQ 保证在每个信道中，每条消息的 Delivery Tag 从 1 开始递增。
         */
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        /**
         *  multiple 取值为 false 时，表示通知 RabbitMQ 当前消息被确认
         *  如果为 true，则额外将比第一个参数指定的 delivery tag 小的消息一并确认
         */
        boolean multiple = false;

        //手动ACK,确认一条消息已经被消费
        channel.basicAck(deliveryTag, multiple);
    }

}
